package com.linshidream.intrachat.simplenio.packet.handler;

import com.linshidream.intrachat.simplenio.packet.context.ConnectionContext;

import java.nio.ByteBuffer;
import java.util.List;

/**
 * Created on 2025/8/18 10:19
 *
 * @author zhengxing
 * @version 1.0.0
 * @description
 */

public class PacketReader {
    /**
     * 负责读取通道中的数据
     * @param ctx
     */
    public static void doRead(ConnectionContext ctx) {

        // 这里设置为每次最多读 1个字节, 缓冲区最大 8kb()
        // 如果只能读到半包, 那么等待下次继续
        // 如果读到粘包, 那么会拆成 List<String> message

        ByteBuffer buffer = ByteBuffer.allocate(1);

        try {
            // 读取的字节长度 循环读
            int len;
            while ((len = ctx.channel().read(buffer)) > 0) {
                buffer.flip();
                ByteBuffer accumulate = ctx.accumulate(buffer);

                // 此时 accumulate 是该通道不断累计的数据
                // accumulate 不满足一条数据，messages则为空
                List<String> messages = ctx.codec().decode(accumulate);

                for (String msg : messages) {
                    // 解析到所有数据后发送业务处理器
                    ctx.handler().channelRead(ctx, msg);
                }
                buffer.clear();
            }

            if (len == -1) {
                ctx.handler().channelInactive(ctx);
            }
        } catch (Exception e) {
            ctx.handler().exceptionCaught(ctx, e);
        }
    }

}
